home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / xpat2-1.000 / xpat2-1 / xpat2-1.04 / src / r_MonteCarlo.c < prev    next >
C/C++ Source or Header  |  1994-04-22  |  4KB  |  132 lines

  1. /*****************************************************************************/
  2. /*                                         */
  3. /*                                         */
  4. /*    X patience version 2 -- module r_MonteCarlo.c                 */
  5. /*                                         */
  6. /*    Characteristics of the ``Monte Carlo'' rules                 */
  7. /*    written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de)             */
  8. /*    04-Apr-1994                                 */
  9. /*    see COPYRIGHT.xpat2 for Copyright details                 */
  10. /*                                         */
  11. /*                                         */
  12. /*****************************************************************************/
  13. #include "xpatgame.h"
  14.  
  15. #define COLUMNS    rules.param[1]
  16.  
  17. static int MC_new_cards(void) {
  18.     int i, hashole = 0;
  19.     for (i = FIRST_SLOT; i <= LAST_SLOT; ++i) {
  20.     switch (CARDS_ON_PILE(i)) {
  21.     case 0:
  22.         hashole = 1;
  23.         break;
  24.     case 1:
  25.         if (hashole)    /* 0 => 1 transition */
  26.         return 1;
  27.         break;
  28.     default:
  29.         return 1;
  30.     }
  31.     }
  32.     return 0;
  33. }
  34.  
  35. static Move MC_deal_cards(void) {
  36.     Pileindex rd, wr;
  37.     int emptybefore, turned;
  38.     int remember_count = game.n_moves;
  39.     store_move(COMPOUND_BEGIN);
  40.     for (wr = rd = FIRST_SLOT; rd <= LAST_SLOT; ++rd) {
  41.     switch (CARDS_ON_PILE(rd)) {
  42.     case 1:
  43.         if (rd != wr) {
  44.         /* shift cards to wr pile */
  45.         store_move(do_move(INDEX_OF_FIRST_CARD(rd), wr++));
  46.         } else
  47.         ++wr;
  48.     case 0:
  49.         break;    /* no action */
  50.     default:
  51.         store_move(do_move(INDEX_OF_FIRST_CARD(rd), FIRST_STACK));
  52.     }
  53.     }
  54.     /* now fill with remaining cards */
  55.     emptybefore = EMPTY(IDECK);
  56.     turned = 0;
  57.     while (wr <= LAST_SLOT && !EMPTY(IDECK)) {
  58.     store_move(do_move(INDEX_OF_LAST_CARD(IDECK), wr++));
  59.     ++turned;
  60.     }
  61.     if (turned)
  62.     store_move(ADD_CHEAT | (Move)turned);
  63.  
  64.     if (EMPTY(IDECK) && !emptybefore)    /* there are no more cards now */
  65.     draw_pileupdate(IDECK, 0);    /* force deck to be redrawn */
  66.  
  67.     game.n_moves = remember_count;
  68.     return COMPOUND_END;    /* this will do the increment */
  69. }
  70.  
  71. static int MC_move_valid(Cardindex src, Pileindex dstpile) {
  72.     int i, thiscard, thatcard;
  73.     Pileindex srcpile = getpile(src);
  74.  
  75.     if (CARDS_ON_PILE(srcpile) != 1 || CARDS_ON_PILE(dstpile) != 1)
  76.     return 0;
  77.     if (game.piletype[srcpile] != Slot || game.piletype[dstpile] != Slot)
  78.     return 0;
  79.     thiscard = game.cards[src];
  80.     thatcard = game.cards[INDEX_OF_LAST_CARD(dstpile)];
  81.     
  82.     if (RANK(thiscard) != RANK(thatcard))
  83.     return 0;
  84.  
  85.     i = (srcpile-FIRST_SLOT) % COLUMNS - (dstpile-FIRST_SLOT) % COLUMNS;
  86.     if (i < -1 || i > 1)
  87.     return 0;
  88.     i = (srcpile-FIRST_SLOT) / COLUMNS - (dstpile-FIRST_SLOT) / COLUMNS;
  89.     if (i < -1 || i > 1)
  90.     return 0;
  91.     return 1;
  92. }
  93.  
  94. struct rules MonteCarlo_rules = {
  95.     "Monte Carlo",/* shortname */
  96.     NULL,    /* longname */
  97.     "mc",       /* abbrev */
  98.     3,        /* layout_hints */
  99.     HINTS_LESSER,/* variant */
  100.     0,        /* customizable */
  101.     0,        /* customized */
  102.     52,        /* numcards */
  103.     4,        /* numstacks */
  104.     25,        /* numslots */
  105.     0,        /* numtmps */
  106.     1,        /* numdecks */
  107.     13,        /* cards_per_color */
  108.     0,        /* numjokers */
  109.     {0, 5, 0, 0},/* param[0], param[1], param[2], param[3] */
  110.     0,        /* facedown */
  111.     1,        /* faceup */
  112.     SLOTS_SAME,    /* newgame_bits */
  113.     NULL,    /* new_game */
  114.     NULL,    /* game_won */
  115.     MC_new_cards,/* new_cards */
  116.     ST_NONE|MG_NONE,    /* move_bits */
  117.     MC_deal_cards,    /* deal_cards */
  118.     NULL,    /* undeal_cards */
  119.     NULL,    /* stackable */
  120.     MC_move_valid,    /* movevalid */
  121.     NULL,    /* valid */
  122.     NULL,    /* relaxed_valid */
  123.     NULL,    /* good_hint */
  124.     NULL,    /* automove */
  125.     NULL,    /* score */
  126.     0,        /* maxscore */
  127.     {0, 0, 0, 0}, /* paramstring blocks */
  128.     0,        /* used */
  129.     NULL,    /* initfunc */
  130.     NULL,    /* local keyboard bindings */
  131. };
  132.